<?php

namespace App\Http\Controllers\Car;


use App\Exports\CommonExport;
use App\Http\Controllers\Controller;
use App\Models\CarModels\CarAccidentRecordDetail;
use App\Models\CarModels\CarAccidentRecordDetailFiles;
use App\Models\CarModels\CarCheck;
use App\Models\CarModels\CarCheckRecord;
use \App\Models\CarModels\CarInfo;
use App\Models\CarModels\CarInsuranceRecordBill;
use App\Models\CarModels\CarInsuranceRecordBillFile;
use App\Models\CarModels\CarInvoiceFile;
use App\Models\CarModels\CarMaintenanceFile;
use App\Models\CarModels\CarQualityFile;
use App\Models\CarModels\CarRegistrationFile;
use App\Models\CarModels\CarVehicleLicenseFile;
use http\Env\Response;
use Illuminate\Http\Request;
use Illuminate\Database\QueryException;
use Illuminate\Support\Facades\DB;
use Validator;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use Workerman\Lib\Timer;


/**
 * @group 运营管理->车辆基础信息管理->车辆信息列表和车辆信息编辑
 *
 * 采用 restful api
 *
 * Body Parameters 表示请求的所需要的参数
 *
 * Query Parameters 表示返回参数的名称
 */
class CarInfoController extends Controller
{
    /**
     * 车辆信息
     *
     * @bodyParam  search 搜索车牌号(模糊查询)
     * @bodyParam  kind  车辆类型 分类筛选 传递车辆类型的id号 精确匹配
     *
     * @queryParam  number 车辆编号
     * @queryParam  framenumber 车架号
     * @queryParam  brand 车辆品牌
     * @queryParam  plates_number 车牌号
     * @queryParam  card_time 上牌时间
     * @queryParam  buy_time 购买时间
     * @queryParam  register_time 登记时间
     * @queryParam  format 车辆规格
     * @queryParam  department_id 部门归属
     * @queryParam  use_department_id 部门归属
     * @queryParam  kinds_id 车辆类型
     * @queryParam  areas_id 所属区域
     * @queryParam  desc 备注信息
     * @queryParam  invoice_id 发票图片 id
     * @queryParam  quality_id 合格证图片 id
     * @queryParam  vehicle_license_id 行驶证图片 id
     * @queryParam  registration_id 登记证图片 id
     * @queryParam  maintenance_id 保养图片 id
     * @queryParam  car_user 当值司机
     * @queryParam  car_manager 负责人id号
     * @queryParam  manager 负责人的信息
     * @queryParam  department 归属部门详细信息
     * @queryParam  use_department 使用部门向下信息
     * @queryParam  status 车辆状态1. 调拨 2.借用 3.使用中 4. 停运
     */
    public function index(Request $request)
    {
        $query = CarInfo::with(['maintenanceImg','registrationImg','vehicleImg','qualityImg','invoiceImg',
            'use_department','department','kinds','area','user','manager','check'])->where(function($query) use ($request) {
            $request->has('search') && $query->where('number', 'like', "%{$request->get('search')}%");

        });
        $query->whereHas('check',function ($q) use ($request){
            $q->where('is_accept','=',true);
            }
        );
        $query->whereHas('kinds',function ($q) use ($request){
            $request->has('kind') && $q->where('kind_id', $request->get('kind'));
        }
        );
        return response()->json(encodeMsg(pageQuery($query,$request),200),200);
    }


    /**
     * 信息添加
     *
     * @bodyParam number string required 车辆识别码
     * @bodyParam brand string optional 车辆品牌
     * @bodyParam plates_number string required 车牌号 不能重复
     * @bodyParam card_time datetime optional 上牌时间
     * @bodyParam format string optional 车辆规格
     * @bodyParam department_id int optional 所属部门 外键 需要先添加部门信息
     * @bodyParam kinds_id int optional 所属类型 外键 需要先添加类型信息
     * @bodyParam areas_id int optional 所属区域 外键 需要先添加区域
     * @bodyParam desc string optional 备注信息
     * @bodyParam car_user int optional 归属司机 外键 用户表
     * @bodyParam car_manager int optional 管理员 外键 用户
     * @bodyParam invoice_ids string optional 发票图片 id
     * @bodyParam quality_ids string optional 合格证图片 id
     * @bodyParam vehicle_license_ids string optional 行驶证图片 id
     * @bodyParam registration_ids string optional 登记证图片 id
     * @bodyParam maintenance_ids string optional 保养图片 id表
     * @bodyParam framenumber string required 车架号
     * @bodyParam buy_time datetime optional 购买时间
     * @bodyParam register_time datetime optional 登记时间
     *
     *
     */
    public function store(Request $request)
    {
        $e = genValidate();
        $validator = Validator::make($request->all(),$e);
        if($validator->fails()){
            return response()->json(encodeMsg($validator->errors()->messages(),400),400);
        }

        DB::beginTransaction();
        try{
            $data=CarInfo::create($request->all());
            if($request->has('invoice_ids')){
                $file_data = [];
                $fileArr = explode(',',$request->get('invoice_ids'));
                foreach ($fileArr as $k=>$value){
                    $tmp = [];
                    $tmp['file_id'] = $value;
                    $tmp['f_id'] = $data->id;
                    array_push($file_data,$tmp);
                }
                try{
                    CarInvoiceFile::insert($file_data);
                }catch (\Exception $e){
                    DB::rollBack();
                    return response()->json(encodeMsg(["message" => "请先确认图片是否已经添加或者图片id是否重复".$e->getMessage()],404), 404);
                }
            }

            if($request->has('quality_ids')){
                $file_data = [];
                $fileArr = explode(',',$request->get('invoice_ids'));
                foreach ($fileArr as $k=>$value){
                    $tmp = [];
                    $tmp['file_id'] = $value;
                    $tmp['f_id'] = $data->id;
                    array_push($file_data,$tmp);
                }
                try{
                    CarQualityFile::insert($file_data);
                }catch (\Exception $e){
                    DB::rollBack();
                    return response()->json(encodeMsg(["message" => "请先确认图片是否已经添加或者图片id是否重复"],404), 404);
                }
            }

            if($request->has('vehicle_license_ids')){
                $file_data = [];
                $fileArr = explode(',',$request->get('invoice_ids'));
                foreach ($fileArr as $k=>$value){
                    $tmp = [];
                    $tmp['file_id'] = $value;
                    $tmp['f_id'] = $data->id;
                    array_push($file_data,$tmp);
                }
                try{
                    CarVehicleLicenseFile::insert($file_data);
                }catch (\Exception $e){
                    DB::rollBack();
                    return response()->json(encodeMsg(["message" => "请先确认图片是否已经添加或者图片id是否重复"],404), 404);
                }
            }

            if($request->has('registration_ids')){
                $file_data = [];
                $fileArr = explode(',',$request->get('invoice_ids'));
                foreach ($fileArr as $k=>$value){
                    $tmp = [];
                    $tmp['file_id'] = $value;
                    $tmp['f_id'] = $data->id;
                    array_push($file_data,$tmp);
                }
                try{
                    CarRegistrationFile::insert($file_data);
                }catch (\Exception $e){
                    DB::rollBack();
                    return response()->json(encodeMsg(["message" => "请先确认图片是否已经添加或者图片id是否重复"],404), 404);
                }
            }

            if($request->has('maintenance_ids')){
                $file_data = [];
                $fileArr = explode(',',$request->get('invoice_ids'));
                foreach ($fileArr as $k=>$value){
                    $tmp = [];
                    $tmp['file_id'] = $value;
                    $tmp['f_id'] = $data->id;
                    array_push($file_data,$tmp);
                }
                try{
                    CarMaintenanceFile::insert($file_data);
                }catch (\Exception $e){
                    DB::rollBack();
                    return response()->json(encodeMsg(["message" => "请先确认图片是否已经添加或者图片id是否重复"],404), 404);
                }
            }
            CarCheck::create(array('car_id'=>$data->id));//新增一辆车之后就新增一个车辆验收表
            DB::commit();
            return response()->json(encodeMsg($data,201),201);
        }catch (QueryException $e){
            DB::rollBack();
            return response()->json(encodeMsg(["message"=>"数据添加出错 请确部门等信息是否正确添加".$e->getMessage()],500),500);
        }

    }

    /**
     * 车辆信息显示(单个信息显示)
     *
     * @bodyParam name string required  车辆所属部门的名称
     * @queryParam number 车辆编号
     * @queryParam brand 车辆品牌
     * @queryParam plates_number 车牌号
     * @queryParam card_time 上牌时间
     * @queryParam format 车辆规格
     * @queryParam department_id 所属部门
     * @queryParam kinds_id 所属类型
     * @queryParam areas_id 所属区域
     * @queryParam desc 备注信息
     * @queryParam invoiceImg 发票图片
     * @queryParam qualityImg 合格证图片
     * @queryParam vehicle_licenseImg 行驶证图片
     * @queryParam registrationImg 登记证图片
     * @queryParam maintenanceImg 保养图片
     * @queryParam maintenance_records 保养记录
     * @queryParam car_user 归属司机
     * @queryParam repair 维修记录
     * @queryParam insurance 保险记录
     * @queryParam push 违章记录
     * @queryParam accident 事故记录
     * @queryParam fuel 加油记录
     * @queryParam year 年检记录
     * @queryParam equipment 设备绑定
     * @queryParam rent 借出状态的车
     * @queryParam allocate 调拨状态的车a
     * @queryParam framenumber 车架号
     * @queryParam  card_time 上牌时间
     * @queryParam  buy_time 购买时间
     *
     *
     */

     public function show($pk)
     {
        $car_data = CarInfo::with(['maintenanceImg','registrationImg','vehicleImg','qualityImg','invoiceImg',
            'maintenance_records','repair','insurance','area','kind','rent','allocate','push','equipment','accident',
            'fuel','year','use_department','department','user'])->find($pk);
        if ($car_data == []) {
            return response()->json(encodeMsg(["message" => "没有该车辆信息"],404), 404);
        } else {
            return response()->json(encodeMsg($car_data,200), 200);
        }
     }

    /**
     * 部门信息修改
     *
     * @queryParam number 车辆编号
     * @queryParam brand 车辆品牌
     * @queryParam plates_number 车牌号
     * @queryParam card_time 上牌时间
     * @queryParam format 车辆规格
     * @queryParam department_id 所属部门
     * @queryParam kinds_id 所属类型
     * @queryParam areas_id 所属区域
     * @queryParam desc 备注信息
     * @queryParam invoice_id 发票图片id
     * @queryParam quality_id 合格证图片id
     * @queryParam vehicle_license_id 行驶证图片id
     * @queryParam registration_id 登记证图片id
     * @queryParam maintenance_id 保养图片id
     * @queryParam record_data 保养记录
     * @queryParam car_user 归属司机
     * @queryParam repair 维修记录
     * @queryParam insurance 保险记录
     * @queryParam push 违章记录
     * @queryParam accident 事故记录
     * @queryParam fuel 加油记录
     * @queryParam year 年检记录
     * @queryParam framenumber 车架号
     * @queryParam  card_time 上牌时间
     * @queryParam  buy_time 购买时间
     *
     * @bodyParam name string optional  车辆所属部门的名称
     * @bodyParam number string optional 车辆编号
     * @bodyParam brand string optional 车辆品牌
     * @bodyParam plates_number string optional 车牌号
     * @bodyParam card_time datetime optional 上牌时间
     * @bodyParam format string optional 车辆规格
     * @bodyParam department_id int optional 所属部门 外键 需要先添加部门信息
     * @bodyParam kinds_id int optional 所属类型 外键 需要先添加类型信息
     * @bodyParam areas_id int optional 所属区域 外键 需要先添加区域
     * @bodyParam desc string optional 备注信息
     * @bodyParam car_user int optional 归属司机 外键 用户表
     * @bodyParam car_manager int optional 管理员 外键 用户表
     * @bodyParam invoice_ids string optional 发票图片 id
     * @bodyParam quality_ids string optional 合格证图片 id
     * @bodyParam vehicle_license_ids string optional 行驶证图片 id
     * @bodyParam registration_ids string optional 登记证图片 id
     * @bodyParam maintenance_ids string optional 保养图片 id表
     * @bodyParam record_data string optional 保养记录
     * @bodyParam framenumber string optional 车架号
     * @bodyParam buy_time datetime optional 购买时间
     * @bodyParam register_time datetime optional 登记时间
     *
     */
    public function update(Request $request, $pk)
    {
        $validator = Validator::make($request->all(),genValidate());
        if($validator->fails()){
            return response()->json(encodeMsg($validator->errors()->messages(),400),400);
        }
        $data = CarInfo::find($pk);
        if ($data == []) {
            return response()->json(encodeMsg(["message" => "没有该车辆信息"],404), 404);
        }

        DB::beginTransaction();
        try {
            if($request->has('invoice_ids')){
                $origin_files = CarInvoiceFile::where('f_id',$data->id)->get()->toArray();//图片原来的id号是好多 取出
                $origin_file_ids = array();//这个数组用于报错以前的所有file的id号
                if($origin_files != []){
                    foreach ($origin_files as $v){
                        array_push($origin_file_ids,$v['id']);
                    }
                }
                $file_data = [];
                $fileArr = explode(',',$request->get('invoice_ids'));
                foreach ($fileArr as $k=>$value){
                    $tmp = [];
                    $tmp['file_id'] = $value;
                    $tmp['f_id'] = $data->id;
                    array_push($file_data,$tmp);
                }
                try{
                    CarInvoiceFile::whereIn('id',$origin_file_ids)->delete();
                    CarInvoiceFile::insert($file_data);
                }catch (\Exception $e){
                    DB::rollBack();
                    return response()->json(encodeMsg(["message" => "请先确认图片是否已经添加或者图片id是否重复".$e->getMessage()],404), 404);
                }
            }
            if($request->has('quality_ids')){
                $origin_files = CarQualityFile::where('f_id',$data->id)->get()->toArray();//图片原来的id号是好多 取出
                $origin_file_ids = array();//这个数组用于报错以前的所有file的id号
                if($origin_files != []){
                    foreach ($origin_files as $v){
                        array_push($origin_file_ids,$v['id']);
                    }
                }
                $file_data = [];
                $fileArr = explode(',',$request->get('quality_ids'));
                foreach ($fileArr as $k=>$value){
                    $tmp = [];
                    $tmp['file_id'] = $value;
                    $tmp['f_id'] = $data->id;
                    array_push($file_data,$tmp);
                }
                try{
                    CarQualityFile::whereIn('id',$origin_file_ids)->delete();
                    CarQualityFile::insert($file_data);
                }catch (\Exception $e){
                    DB::rollBack();
                    return response()->json(encodeMsg(["message" => "请先确认图片是否已经添加或者图片id是否重复"],404), 404);
                }
            }
            if($request->has('vehicle_license_ids')){
                $origin_files = CarVehicleLicenseFile::where('f_id',$data->id)->get()->toArray();//图片原来的id号是好多 取出
                $origin_file_ids = array();//这个数组用于报错以前的所有file的id号
                if($origin_files != []){
                    foreach ($origin_files as $v){
                        array_push($origin_file_ids,$v['id']);
                    }
                }
                $file_data = [];
                $fileArr = explode(',',$request->get('vehicle_license_ids'));
                foreach ($fileArr as $k=>$value){
                    $tmp = [];
                    $tmp['file_id'] = $value;
                    $tmp['f_id'] = $data->id;
                    array_push($file_data,$tmp);
                }
                try{
                    CarVehicleLicenseFile::whereIn('id',$origin_file_ids)->delete();
                    CarVehicleLicenseFile::insert($file_data);
                }catch (\Exception $e){
                    DB::rollBack();
                    return response()->json(encodeMsg(["message" => "请先确认图片是否已经添加或者图片id是否重复"],404), 404);
                }
            }
            if($request->has('registration_ids')){
                $origin_files = CarRegistrationFile::where('f_id',$data->id)->get()->toArray();//图片原来的id号是好多 取出
                $origin_file_ids = array();//这个数组用于报错以前的所有file的id号
                if($origin_files != []){
                    foreach ($origin_files as $v){
                        array_push($origin_file_ids,$v['id']);
                    }
                }
                $file_data = [];
                $fileArr = explode(',',$request->get('registration_ids'));
                foreach ($fileArr as $k=>$value){
                    $tmp = [];
                    $tmp['file_id'] = $value;
                    $tmp['f_id'] = $data->id;
                    array_push($file_data,$tmp);
                }
                try{
                    CarRegistrationFile::whereIn('id',$origin_file_ids)->delete();
                    CarRegistrationFile::insert($file_data);
                }catch (\Exception $e){
                    DB::rollBack();
                    return response()->json(encodeMsg(["message" => "请先确认图片是否已经添加或者图片id是否重复"],404), 404);
                }
            }
            if($request->has('maintenance_ids')){
                $origin_files = CarMaintenanceFile::where('f_id',$data->id)->get()->toArray();//图片原来的id号是好多 取出
                $origin_file_ids = array();//这个数组用于报错以前的所有file的id号
                if($origin_files != []){
                    foreach ($origin_files as $v){
                        array_push($origin_file_ids,$v['id']);
                    }
                }
                $file_data = [];
                $fileArr = explode(',',$request->get('maintenance_ids'));
                foreach ($fileArr as $k=>$value){
                    $tmp = [];
                    $tmp['file_id'] = $value;
                    $tmp['f_id'] = $data->id;
                    array_push($file_data,$tmp);
                }
                try{
                    CarMaintenanceFile::whereIn('id',$origin_file_ids)->delete();
                    CarMaintenanceFile::insert($file_data);
                }catch (\Exception $e){
                    DB::rollBack();
                    return response()->json(encodeMsg(["message" => "请先确认图片是否已经添加或者图片id是否重复"],404), 404);
                }
            }
            $data->update($request->all());
            DB::commit();
            return response()->json(encodeMsg($data,200), 200);
        }catch (QueryException $e){
            DB::rollBack();
            return response()->json(encodeMsg(["message"=>"修改时出错".$e->getMessage()],500),500);
        }
    }

    /**
     * 部门信息删除
     */

    public function destroy($pk)
    {
        $data = CarInfo::find($pk);
        if ($data == []) {
            return response()->json(encodeMsg(["message" => "没有该车辆信息"],404), 404);
        }
        $data->delete();
        return response()->json(encodeMsg(["message" => "删除成功"],404), 200);
    }




    /**
     * 车辆信息导出 excel 测试用
     * @queryParam id 序号
     * @queryParam number 车辆编号
     * @queryParam brand 车辆品牌
     * @queryParam plates_number 车牌号
     * @queryParam card_time 上牌时间
     * @queryParam format 车辆规格
     * @queryParam department->name 所属部门
     * @queryParam kinds->kind->name 车辆类型
     * @queryParam area->name 所属区域
     * @queryParam desc 备注信息
     * @queryParam user->name 归属司机
     * @queryParam quality_img|bool 是否有合格证
     * @queryParam status|status:1=>调拨,2=>借用,3=>使用中,4=>停运 车辆状态
     *
     */
    public function export(Request $request)
    {

        $cellData = $this->index($request);//excel的内容
        $data = $cellData->getData()->data->data;
        $writer = excelExport($data,genExport());
        header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
        header('Content-Disposition: attachment;filename="01simple.xlsx"');//execl名字
        $writer->save('php://output');
    }
}
